TypeScriptのEither型を用いたError Handling
Eitherを使うことのデメ
ライブラリが必要
自作でもいいが、限界がある
left|rgithがあればいいという話ではない
JS/TSの言語思想はtry/catchなので扱いがめんどい
標準関数や、使用しているLibraryはバンバンthrowしてくる
結局、throwもEItherも両方気にしないといけなくなる
わかる、Eitherでやってないけどそうなるのが容易に想像できるmrsekut.icon
try/catchをEitherに変換する関数が必要
イメージ
code:ts
function tryCatch<T, E>(
func: () => T,
onCatch: (e: unknown) => E
): Result<T, E> {
try {
const value = func();
return right(value);
} catch (err) {
return left(onCatch(err));
}
}
使用
code:ts
const x = tryCatch(() => JSON.parse('{ "hoge": "piyo" }'));
const y = tryCatch(() => { throw 0 });
console.log(x); // => { _tag: 'Some', value: { hoge: 'piyo' } }
console.log(y); // => { _tag: 'None' }
成功すればその結果を、throwされればNoneを返す
良い感じ
でも、自作すると、伝播させる時にダルくなる
fp-tsとかで、monadを使うのはそのだるさを回避するためだから、トレードオフmrsekut.icon